package cn.good.yan.service.t7;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 7. 原子类
 * 基本类型原子类：AtomicInteger、AtomicBoolean、AtomicLong
 * 原子性 - 新增 （从1 加到1000 ，20个线程分别新增，最终结果是一致的）
 *
 * @author shengren.yan
 * @create 2024-03-30
 */
public class AtomicDemo1 {

    public static final int SIZE = 50;

    public static void main(String[] args) throws InterruptedException {
        // 【原子性的变量】 分批新增，50个线程分批运行，快速新增，最终的值是要保持 原子性
        MyNumber myNumber = new MyNumber();
        // CountDownLatch 线程工具  ， 开启50个线程
        CountDownLatch countDownLatch = new CountDownLatch(SIZE);
        for (int i = 1; i <= SIZE; i++) {
            new Thread(() -> {
                try {
                    // 从1 累加 加到 1000
                    for (int j = 1; j <= 1000; j++) {
                        myNumber.addPlusPlus();
                    }
                } finally {
                    countDownLatch.countDown();
                }
            }, String.valueOf(i)).start();
        }
        // 等待上面50个线程全部计算完成后，再去获得最终值

        // 暂停几秒钟线程
        // try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); }
        // 该线程阻塞，50个线程都没执行完，main线程一致阻塞，状态
        countDownLatch.await();
        System.out.println(Thread.currentThread().getName() + "\t" + "result: " + myNumber.atomicInteger.get());
    }

}

// 实体
class MyNumber {
    // 原子类
    AtomicInteger atomicInteger = new AtomicInteger();

    public void addPlusPlus() {
        // 获取当前值，并自增
        atomicInteger.getAndIncrement();
    }
}